package com.superman.config;

import com.superman.cache.Cache;
import com.superman.cache.JacksonCacheSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.support.collections.DefaultRedisMap;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.annotation.Resource;
import java.time.Duration;

/**
 * 全局缓存配置
 * 内存缓：清除过期缓存可能会很耗费性能， 建议自动清理间隔放长一些， 如果缓存的数据量过大，可能会导致内存溢出
 * redis缓存：redis会自动清理
 * jdbc缓存：使用sql批量清理过期缓存，自动清理间隔可以适当小些
 * <p>
 * Author: superman
 * Date: 2024/5/21 13:01
 */
@Configuration
public class CacheConfig {

    @Resource(name = "stringRedisTemplate")
    private StringRedisTemplate stringRedisTemplate;

    @Resource(name = "jdbcTemplate")
    private JdbcTemplate jdbcTemplate;

    @Bean("globalCache")
    public Cache createGlobalCache() {
        return new Cache.CacheBuilder()
                .openMemoryCache(new DefaultRedisMap<>("memory", stringRedisTemplate))
                .openRedisCache(stringRedisTemplate)
                .openJdbcCache(jdbcTemplate)
                .setSerializer(new JacksonCacheSerializer())
                // 设置 自动清理过期缓存的时间间隔
//                .setAutoClearExpired(Duration.ofHours(12))
                .setAutoClearExpired(Duration.ofSeconds(60))
                .build();
    }


}
